home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 41
/
Amiga Format CD41 (1999-06)(Future Publishing)(GB)[!][issue 1999-07].iso
/
-seriously_amiga-
/
cd-rom
/
acdb
/
src
/
acdb_net.e
< prev
next >
Wrap
Text File
|
1999-04-28
|
6KB
|
281 lines
OPT MODULE,OSVERSION=37
OPT PREPROCESS,REG=5
/*
*-- AutoRev header do NOT edit!!
*
* Project : ACDB (AMIGA CD Base) - program obsîugujâcy CDDB
* File : acdb_net.e
* Description : obsîuga HTTP-GET via bsdsocket.library
* Copyright : ©1999, Piotr Gapiïski
* Author : Piotr Gapiïski
* Creation Date : 09.03.99
* Current version : 1.0
* Translator : AmigaE v3.3a
*
*
*-- REVISION HISTORY
*
* 0.5 (05.01.99)
* o jednolita konwencja nazw procedur w module
* o moûliwoôê przerwania odbioru danych przez wysîanie sygnaîy CTRL-D
* o procedura umoûliwiajâca przerwanie pëtli odbioru procedury netReceive()
* o procedura metSendcmd() jest teraz zgodna z HTTP1.0 oraz HTTP1.1
* (koniec linii CRFL,CRLF)
*
* 0.5 (05.01.99)
* o nowa procedura odbierajâca dane receive()
* zajmuje sië takûe obsîugâ interfejsu uûytkownika (parametr gui=NIL)
*
* 0.4 (03.01.99)
* o wysyîanie metody GET koïczy sië teraz sekwencjâ CRLF (patrz RFC1945)
*
* 0.3 (28.12.98)
* o wysyîanie znacznika HTTP/1.0 zablokowane
* zdaje sië, ûe to i tak nie dziaîaîo...
*
* 0.2 (26.12.98)
* o netperror() zablokowana - aû tak szczegóîowe komunikaty o bîëdach sâ zbëdne
* o poîâczenia sâ tylu KEEPALIVE dziëki czemu pomiëdzy poszczególnymi wywoîaniami
* Send() poîâczenie nie jest koïczone
*
* 0.1 (22.12.98)
* o pierwsza wersja (BETA)
* wzorowane na httpget z pakietu amitcp/ip
*
*/
MODULE 'tools/easygui'
MODULE 'amiTCP/netdb','amiTCP/netinet/in','amiTCP/sys/socket'
MODULE 'amiTCP/amiTCP/socketbasetags','bsdsocket','utility/tagitem','dos/dos','exec/tasks'
MODULE '*acdb_debug','*acdb_gui'
#ifdef DEBUG
MODULE 'tools/debug'
#define D(a,b) kputfmt(a,b)
#endif
#ifndef DEBUG
#define D(a,b)
#endif
EXPORT PROC netSetup()
->-
->- procedura inicjalizujâca obsîugë sieci
->- zwraca TRUE/FALSE
->-
DEF rc
socketbase := OpenLibrary('bsdsocket.library', 4)
rc := IF (socketbase) THEN TRUE ELSE FALSE
ENDPROC rc
EXPORT PROC netCleanUp()
->-
->- procedura zwalniajâca zasoby zaalokowane przez netSetup()
->- nie zwraca ûadnej wartoôci
->-
IF (socketbase) THEN CloseLibrary(socketbase)
socketbase := NIL
ENDPROC
EXPORT PROC netConnect(host:PTR TO CHAR, port)
->-
->- top-level, poîâczenie z wybranym hostem przez odpowiedni port
->- w wypadku bîëdu zwraca (-1) zamiast FALSE!!!
->- zwraca deskryptor gniazda (>0) lub kod bîëdu (-1)
->-
DEF addr:sockaddr_in
bzero(addr, SIZEOF sockaddr_in)
IF getsockaddr(host, port,addr)=FALSE THEN RETURN (-1)
ENDPROC inetconn(addr)
EXPORT PROC netSendcmd(sd, cmd:PTR TO CHAR)
->-
->- wysîanie komendy przez HTTP1.0/GET (wymagany tryb NONBLOCKING)
->- komenda musi(?) koïczyê sië znakami CRLFCRLF
->- zwraca TRUE/FALSE
->-
DEF len
LowerStr(cmd)
len := StrLen(cmd)
IF (Send(sd, 'GET ', STRLEN, 0) <> STRLEN) OR
(Send(sd, cmd, len, 0) <> len) OR
(Send(sd, '\b\n\b\n', STRLEN, 0) <> STRLEN) THEN RETURN FALSE
ENDPROC TRUE
EXPORT PROC netReceive(sd, buff:PTR TO CHAR, max)
->-
->- odbiera max bajtów do bufora w paczkach po 100 bajtów
->- odbiór moûna przerwaê wysyîajâc do tasku programu sygnaî CTRL-D
->- zwraca TRUE/FALSE (TRUE gdy wszystkie dane zostaîy odebrane)
->-
DEF len=0, i=0
SetSignal(0, SIGBREAKF_CTRL_D)
WHILE TRUE
->-
->- ûâdanie przerwania odczytu?
->-
guiCheckGadgets()
IF (SetSignal(0, SIGBREAKF_CTRL_D) AND SIGBREAKF_CTRL_D) THEN RETURN FALSE
EXIT (len > max)
i := Recv(sd, (buff + len), 100, 0)
EXIT (i<=0)
len := len + i
ENDWHILE
->-
->- i=0 oznacza koniec odbioru
->-
IF (len > max) OR (i < 0) THEN RETURN FALSE
ENDPROC len
EXPORT PROC netAbort()
->-
->- procedura wysyîajâca do programu sygnaî przerwania odczytu
->- nie zwraca ûadnej wartoôci
->-
Signal(FindTask(NIL), SIGBREAKF_CTRL_D)
ENDPROC
->-
->- prywatne
->- procedury wspomagajâce obsîugë sieci
->-
PROC getsockaddr(host:PTR TO CHAR, port, addr:PTR TO sockaddr_in)
->-
->- middle-level, inicjalizacja struktury sockaddr_in
->- zwraca TRUE/FALSE (FALSE gdy nie moûna znaleúê hosta w sieci)
->-
DEF remote:PTR TO hostent
IF (remote := Gethostbyname(host))
bcopy(remote.h_addr, addr.addr, remote.length)
ELSE
addr.addr.addr := Inet_addr(host)
IF (addr.addr.addr = -1) THEN RETURN FALSE
ENDIF
addr.family := AF_INET
addr.port := htons(port)
ENDPROC TRUE
PROC inetconn(addr:PTR TO sockaddr_in)
->-
->- lov-level, poîâczenie (tryb NONBLOCKING) z hostem
->- zwraca (-1) w przypadku bîëdu lub socketdescription (SD)
->-
DEF sd,one=1
IF (sd := Socket(AF_INET, SOCK_STREAM, 0)) < 0
->- netperror('socket')
RETURN (-1)
ENDIF
Setsockopt(sd, SOL_SOCKET, SO_KEEPALIVE, {one}, 1)
IF (Connect(sd, addr, SIZEOF sockaddr_in)) < 0
CloseSocket(sd)
->- netperror('connect')
RETURN (-1)
ENDIF
ENDPROC sd
/*
PROC netperror(banner=NIL) IS EMPTY
PROC netperror(banner=NIL:PTR TO CHAR)
->- komunikat o bîëdzie z opisem generowanym przez TCP/IP
->-
DEF taglist[5]: ARRAY OF LONG,tmp
tmp:=Errno()
taglist[0] := SBTM_GETVAL(SBTC_ERRNO)
taglist[2] := SBTM_GETREF(SBTC_ERRNOSTRPTR)
taglist[3] := {tmp}
taglist[4] := TAG_DONE
SocketBaseTagList(taglist)
informUser('%s: %s',NIL,[IF (banner) THEN banner ELSE 'TCP/IP', tmp, NIL])
ENDPROC
*/
PROC bcopy(src, dst, len)
->-
->- kopiowanie len bajtów spod adresu src do dst
->- nie zwraca ûadnej wartoôci
->-
MOVE.L len,D0
SUBQ.L #1,D0
MOVE.L src,A0
MOVE.L dst,A1
bcopy_loop:
MOVE.B (A0)+,(A1)+
DBRA.B D0,bcopy_loop
ENDPROC
PROC bzero(src, len)
->-
->- czyszczenie (ustawianie na 0) len bajtów od adresu src
->- nie zwraca ûadnej wartoôci
->-
MOVE.L src,A0
MOVE.L len,D0
SUBQ.L #1,D0
bzero_loop:
MOVE.B #0,(A0)+
DBRA.B D0,bzero_loop
ENDPROC